#ifndef _M_UTIL_H_
#define _M_UTIL_H_ 
#include<iostream>
#include<string>
#include<memory>
#include<sstream>
#include<mysql/mysql.h>
#include<jsoncpp/json/json.h>
using namespace std;

namespace im
{
  class JsonUtil 
  {//Json序列化和反序列化
    public:
    static bool serialize(Json::Value &value,string *body)//Json序列化
    {
     Json::StreamWriterBuilder swb;//构造对象序列化
     unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());//sw管理swb中的数据(智能指针)
     stringstream ss;
     int ret = sw->write(value,&ss);//序列化接口
     if(ret!=0)
     {
         cout<<"serialize failed!!"<<endl;
         return false;
     }
      *body=ss.str();//body存入数据value
      return true;
    }

    static bool unserialize(string &body,Json::Value *value)//反序列化
    {
      Json::CharReaderBuilder crb;
      unique_ptr<Json::CharReader> cr(crb.newCharReader()); 
      string err;//保存错误信息
      bool ret=cr->parse(body.c_str(),body.c_str()+body.size(),value,&err);
      if(ret==false)
      {
        cout<<"unserialize error!!"<<endl;
        return false;
      }
      return true;
    }
  };
  class MysqlUtil{
    public:
      static MYSQL *mysql_create(const string &host,
          const string &user,
          const string &pass,
          const string &db,
          int port)//创建初始化，连接服务器，设置字符集，选择数据库
      {
        MYSQL *mysql=mysql_init(NULL);//创建初始化操作句柄
        if(NULL==mysql)
        {
          cout<<"mysql inti failed"<<endl;
          return NULL;
        }
        if(mysql_real_connect(mysql,host.c_str()
              ,user.c_str()
              ,pass.c_str()
              ,db.c_str(),port,NULL,0)==NULL)//连接服务器，设置字符集，判断是否成功
        {
          cout<<"connect server failed:"<<mysql_error(mysql)<<endl;
          mysql_close(mysql);
          return NULL;
        }
        mysql_set_character_set(mysql,"utf8");//选择数据库
        return mysql;
      }
      static bool mysql_exec(MYSQL *mysql,const string &sql)//数据查询
      {
        int ret=mysql_query(mysql,sql.c_str());
        if(ret!=0)
        {
          cout<<sql<<endl;
          cout<<"query failed:"<<mysql_error(mysql)<<endl;
          return false;
        }
        return true;
      }
      static void mysql_destory(MYSQL *mysql)//关闭操作句柄
      {
        if(NULL==mysql)
        {
          return ;
        }
        mysql_close(mysql);
      }
  };
}
#endif
